# 导入个人中心蓝图
from flask import current_app
from flask import g, jsonify
from flask import redirect
from flask import render_template
from flask import request

from info import constants, db
from info.models import Category, News, User
from info.utils.common import user_login_data
from info.utils.image_storage import image_storage
from info.utils.response_code import RET
from . import profile_blue


# 获取作者发布新闻列表
@profile_blue.route('/other_news_list')
def other_news_list():
    """
    1.接收参数：作者user_id,page分页
    2.校验参数
    3.参数类型转换
    3.获取新闻列表
    4.对象转换为字典
    5.返回数据
    :return:
    """
    # 1.接收参数：作者id
    author_id = request.args.get('user_id')
    page = request.args.get('p',1)
    # 2.校验参数
    if not all([author_id,page]):
        return jsonify(errno=RET.PARAMERR,errmsg='参数不全')
    # 参数类型转换
    try:
        page = int(page)
    except Exception as e:
        current_app.logger.error(e)
        page = 1
    # 校验作者是否存在
    try:
        author = User.query.get(author_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg="查询数据失败")
    if not author:
        return jsonify(errno=RET.NODATA,errmsg='该作者不存在')
    # 3.获取新闻列表
    try:
        paginate = author.news_list.order_by(News.create_time.desc()).paginate(page, 2, False)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg="数据库查询失败")
    # 4.对象转换为字典
    total_page = paginate.pages
    current_page = paginate.page
    items = paginate.items
    news_list=[]
    for news in items:
        news_list.append(news.to_dict())

    # 5.返回数据
    data = {
        'total_page':total_page,
        'current_page':current_page,
        'news_list':news_list
    }
    return jsonify(errno=RET.OK,errmsg='发送成功',data=data)



# 获取作者详情列表
@profile_blue.route('/other')
@user_login_data
def other_info():
    """
    1.获取参数:获取作者id
    2.校验参数
    3.获取对象转字典
    4.返回数据
    :return:
    """
    # 1.获取参数:获取作者id
    author_id = request.args.get('id')
    # 2.校验参数
    if not author_id:
        return jsonify(errno=RET.PARAMERR,errmsg='参数不全')
    # 3.获取对象转字典
    try:
        author = User.query.get(author_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg="数据库查询错误")
    # 4.返回数据
    if not author:
        return jsonify(errno=RET.NODATA,errmsg='该作者不存在')
    is_followed = False
    if g.user :
        if g.user in author.followers:
            is_followed = True
    # 拼接信息返回
    data = {
        'author_info':author.to_dict(),
        'is_followed':is_followed,
        'user_info':g.user.to_dict() if g.user else ''
    }
    return render_template('news/other.html', data=data)





# 我的关注
@profile_blue.route('/user_follow')
@user_login_data
def user_follow():
    """
    1.接收参数p
    2.转换类型
    3.查询获取分页对象
    4.分页对象数据返回
    5.返回状态数据
    :return:
    """
    # 1.接收参数p
    page = request.args.get('p', 1)
    # 2.转换类型
    try:
        page = int(page)
    except Exception as e:
        current_app.logger.error(e)
        page =1
    # 3.查询获取分页对象
    paginate =g.user.followed.paginate(page,1,False)
    # 4.分页对象数据返回
    totalPage = paginate.pages
    currentPage= paginate.page
    items = paginate.items
    # 将分页对象转换为字典
    user_list = []
    for user in items:
        user_list.append(user.to_dict())

    # 5.返回状态数据
    data ={
        'totalPage':totalPage,
        'currentPage':currentPage,
        'user_list':user_list
    }
    return render_template('news/user_follow.html',data=data)



# 展示用户发布的新闻列表功能
@profile_blue.route('/news_list')
@user_login_data
def news_list():
    """
    1.判断用户是否登陆
    1.接收参数
    2.转换类型
    3.分页查询
    4.获取分页查询数据返回
    5.返回数据
    :return:
    """
    # 1.判断用户是否登陆
    if not g.user:
        return jsonify(errno=RET.NODATA,errmsg='该用户未登录')
    # 1.接收参数
    page = request.args.get('p', 1)
    # 2.转换类型
    try:
        page = int(page)
    except Exception as e:
        current_app.logger.error(e)
        page = 1
    # 3.分页查询
    paginate = g.user.news_list.order_by(News.create_time.desc()).paginate(page,constants.HOME_PAGE_MAX_NEWS,False)
    # 4.获取分页查询数据返回
    totalPage = paginate.pages
    currentPage = paginate.page
    items = paginate.items
    # 5.返回数据
    news_release_list =[]
    for news in items:
        news_release_list.append(news.to_review_dict())
    data={
        'totalPage':totalPage,
        'currentPage':currentPage,
        'news_list':news_release_list
    }
    return  render_template('news/user_news_list.html', data=data)


# 新闻发布功能
@profile_blue.route('/news_release',methods=['get','post'])
@user_login_data
def news_release():
    """
    1.get请求，返回页面
    1.获取参数（获取前端填写的内容）
    2.校验参数
    3.上传图片
    4.创建新闻对象，设置属性
    5.更新数据
    6.返回响应
    :return:
   """
    # 1.get请求，返回页面
    if request.method == 'GET':
        try:
             # 获取所有分类
            categories = Category.query.all()
            # 把最新这个类取出，最新不是一个页面
            categories.pop(0)
        except Exception as e:
            current_app.logger.error(e)
            return jsonify(errno=RET.DBERR,errmsg="分类查询失败")
        category_list=[]
        for category in categories:
            category_list.append(category.to_dict())

        return render_template('news/user_news_release.html',categories=category_list)
    # 2.获取参数
    title =request.form.get('title')
    category_id =request.form.get('category_id')
    digest =request.form.get('digest')
    file_name = request.files.get('index_image')
    content =request.form.get('content')
    # 校验参数
    # 3.校验参数
    if not all([title, category_id, digest, file_name, content]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数不全")
    # 3.上传图片
    try:
        # 读取图片为二进制流
        image_data=file_name.read()
        image_name=image_storage(image_data)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.THIRDERR, errmsg="七牛云上传失败")
        # 5.判断头像是否上传成功
    if not image_name:
        return jsonify(errno=RET.DATAERR, errmsg="上传失败")
    # 4.创建新闻对象，设置属性
    news =News()
    news.title=title
    news.source='个人发布'
    news.digest=digest
    news.content=content
    news.index_image_url=constants.QINIU_DOMIN_PREFIX + image_name
    news.category_id=category_id
    news.user_id=g.user.id
    news.status=1 # 代表正在审核中
    # 5.更新数据
    # 6.更新到数据库
    try:
        db.session.add(news)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg="发布新闻失败")
    # 6.返回响应
    return jsonify(errno=RET.OK, errmsg="发布成功")


# 我的收藏功能
@profile_blue.route('/collection')
@user_login_data
def collection():
    """
     思路分析:
    1.获取参数
    2.转换参数类型
    3.分页查询,得到分页对象
    4.获取分页对象中属性,总页数,当前页,对象列表
    5.将对象列表转成字典列表
    6.拼接数据,返回页面
    :return:
    """

    # 1.获取参数
    page = request.args.get("p",1)
    # 2.转换参数类型
    try:
        page = int(page)
    except Exception as e:
        current_app.logger.error(e)
        page = 1

    # 3.分页查询,得到分页对象
    try:
        paginate = g.user.collection_news.paginate(page, constants.USER_COLLECTION_MAX_NEWS, False)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="查询新闻失败")
    # 4.获取分页对象中属性,总页数,当前页,对象列表
    totalPage = paginate.pages
    currentPage = paginate.page
    items = paginate.items
    # 5.将对象列表转成字典列表
    news_list = []
    for news in items:
        news_list.append(news.to_dict())
    # 6.拼接数据,返回页面
    data = {
        "totalPage": totalPage,
        "currentPage": currentPage,
        "news_list": news_list
    }
    return render_template('news/user_collection.html', data=data)

# 修改密码
@profile_blue.route('/pass_info',methods=['GET','POST'])
@user_login_data
def pass_info():
    """
    1.get请求，返回页面
    2.获取参数：old_password,new_password.
    3.校验参数，为空校验，
    4.原密码错误校验
    5.修改用户密码
    6.返回状态
    :return:
    """

    # 1.get请求，返回页面
    if request.method == 'GET':
        return render_template('news/user_pass_info.html')
    # 2.获取参数：oldpassword,newPassword.
    old_password=request.json.get('old_password')
    new_password=request.json.get('new_password')
    # 3.校验参数，为空校验，
    if not all([old_password,new_password]):
        return jsonify(errno=RET.PARAMERR,errmsg='参数不全')
    # 4.原密码错误校验
    if not g.user.check_passowrd(old_password):
        return jsonify(errno=RET.DATAERR, errmsg="旧密码不正确")
    # 5.修改用户密码
    g.user.password = new_password
    # 6.返回状态
    return jsonify(errno=RET.OK, errmsg="修改成功")


# 请求路径: /user/pic_info
# 请求方式:GET,POST
# 请求参数:无, POST有参数,avatar
# 返回值:GET请求: user_pci_info.html页面,data字典数据, POST请求: errno, errmsg,avatar_url
#用户头像获取/设置
@profile_blue.route('/pic_info',methods=['GET','POST'])
@user_login_data
def pic_info():
    """
    1.第一次进来，点头像设置这几个字，get请求，返回页面
    2.接受获取参数，
    参数：avatar_url
    3.校验参数：为空校验
    4.上传图片
    5.判断头像是否上传成功
    6.设置头像属性给用户
    7.返回状态
    :return:
    """
    # 1.第一次进来，点头像设置这几个字，get请求，返回页面
    if request.method == 'GET':
        return render_template('news/user_pic_info.html',user_info = g.user.to_dict() if g.user else '')
    # 2.接受获取参数，
    # 参数：avatar_url
    file = request.files.get('avatar')
    # 3.校验参数：为空校验
    if not file:
        return jsonify(errno=RET.NODATA,errmsg='图片不能为空')
    # 4.上传图片
    try:
        # 读取图片为二进制
        image_data = file.read()
        # 调用方法，上传图片，获得图片名称
        image_name = image_storage(image_data)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.THIRDERR,errmsg="七牛云上传失败")

    # 5.判断头像是否上传成功
    if not image_name:
        return jsonify(errno=RET.DATAERR, errmsg="上传失败")
    # 6.设置头像属性给用户
    g.user.avatar_url = image_name

    data={
        "avatar_url":constants.QINIU_DOMIN_PREFIX + image_name
    }
    # 7.返回状态
    return jsonify(errno=RET.OK, errmsg="上传成功", data=data)


#基本资料展示
# 请求路径: /user/base_info
# 请求方式:GET,POST
# 请求参数:POST请求有参数,nick_name,signature,gender
# 返回值:errno,errmsg
@profile_blue.route('/base_info',methods=['GET','POST'])
@user_login_data
def base_info():
    """
    1.返回基本设置base_info页面
    2.接受参数
    参数：signature,nick_name,gender
    3.校验参数,为空判断，
    4.性别校验
    5.修改个人信息，提交
    6.返回状态
    :return:
    """
    # 1.返回基本设置base_info页面
    if request.method == 'GET':
        return render_template('news/user_base_info.html',user_info=g.user.to_dict() if g.user else '')
    # 2.接受参数,表单的提交使用form获取参数
    # 参数：signature, nick_name, gender
    signature = request.json.get('signature')
    nick_name = request.json.get('nick_name')
    gender = request.json.get('gender')
    # 3.校验参数,为空判断，
    if not all([signature,nick_name,gender]):
        return jsonify(errno=RET.PARAMERR,errmsg='参数不全')
    # 4.性别校验
    if not gender in ['MAN','WOMAN']:
        return jsonify(errno=RET.DATAERR,errmsg='性别异常')
    # 5.修改个人信息，提交
    g.user.signature = signature
    g.user.nick_name = nick_name
    g.user.gender = gender
    # 6.返回状态
    return jsonify(errno=RET.OK,errmsg='修改成功')

# 展示个人中心页面
@profile_blue.route('/info')
@user_login_data
def user_info():
    """
    返回用户信息页面主页
    :return:
    """
    # 判断用户是否登陆
    if not g.user:
        return redirect('/')
    # 拼接数据返回页面
    data={
        'user_info':g.user.to_dict()
    }
    return render_template('news/user.html',data=data)
